package com.mrx.commons.util.asserts;

import com.alibaba.fastjson.annotation.JSONField;
import com.mrx.commons.exception.BusinessException;

/**
 * @author : 肖康宁
 * @since : 2022-12-09 14:53
 **/
public interface IAssert {

    @JSONField
    int getCode();

    @JSONField
    String getMsg();

    BusinessException getException(String msg);

    BusinessException getException();

    /**
     * 当 exp 为 false 时将会抛出异常
     *
     * @param exp 要检测的表达式
     * @param msg 额外异常消息
     */
    default void checkTrue(boolean exp, String msg) {
        if (!exp) throw getException(msg);
    }

    /**
     * 当 exp 为 false 时将会抛出异常
     *
     * @param exp 要检测的表达式
     */
    default void checkTrue(boolean exp) {
        if (!exp) throw getException();
    }

    /**
     * 当 exp 不为 false 时抛出异常
     *
     * @param exp 要检测的表达式
     */
    default void checkFalse(boolean exp) {
        checkTrue(!exp);
    }

    default <T> T checkNotNull(T obj) {
        checkTrue(obj != null);
        return obj;
    }

    default <T> T checkNull(T obj) {
        checkTrue(obj == null);
        return obj;
    }

}
